package com.gupaoedu.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

/**
 * 腾讯课堂搜索 咕泡学院
 * 加群获取视频：608583947
 * 风骚的Michael 老师
 */
public class ClientDemo {

    /** 功能描述: <br>
     * 从现象分析，本地与服务端建立TCP长连接，客户端阻塞调取服务端接口，服务端处理完后返回，rmi屏蔽底层交互，程序员感觉像本地方法
     *
     * @param args
     * @return: void
     * @since: 1.0.0
     * @Author: Jly
     * @Date: 2018/11/16 17:27
     */
    public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
        /**
         * lookup里面的Registry registry = getRegistry(parsed);
         * 生成的是 RegistryImpl_stub
         *
         * RegistryImpl_stub.lookup 调用的是newCall
         * RemoteCall var2 = this.ref.newCall(this, operations, 2, 4905912898345647071L);
         * newCall 里面初始化 StreamRemoteCall
         * StreamRemoteCall var7 = new StreamRemoteCall(var6, this.ref.getObjID(), var3, var4);
         * 从远程返回一个动态代理对象
         * 该动态代理回调函数是 RemoteObjectInvocationHandler
         */
        IHelloService helloService=(IHelloService)Naming.lookup("rmi://127.0.0.1/Hello");
        // HelloServiceImpl实例(HelloServiceImpl_stub)   ---貌似不对
        // RegistryImpl_stub
        /**
         * 执行sayHello 触发 RemoteObjectInvocationHandler 的 invoke 方法
         * invoke 调用 invokeRemoteMethod(proxy, method, args);
         * invokeRemoteMethod 执行的是 return ref.invoke((Remote) proxy, method, args,getMethodHash(method));
         * 断点跟踪，执行完 var7.executeCall(); 进入server 执行server 的 HelloServiceImpl.sayHello; 本地线程阻塞
         * 得到结果后var11 = var7.getInputStream(); 可以看到执行结果
         */
        System.out.println(helloService.sayHello("Micii"));
    }
}
